const { verifyToken } = require('../utils/jwt');
const User = require('../models/User');

/**
 * JWT认证中间件
 */
const auth = async (req, res, next) => {
  try {
    const authHeader = req.header('Authorization');
    
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({
        success: false,
        message: '访问令牌缺失或格式错误'
      });
    }

    const token = authHeader.substring(7); // 移除 'Bearer ' 前缀
    
    // 验证令牌
    const decoded = verifyToken(token);
    
    // 查找用户
    const user = await User.findById(decoded.userId);
    if (!user) {
      return res.status(401).json({
        success: false,
        message: '无效的访问令牌'
      });
    }

    // 检查用户是否激活
    if (!user.isActive) {
      return res.status(403).json({
        success: false,
        message: '账户已被禁用'
      });
    }

    // 将用户信息添加到请求对象
    req.user = {
      userId: user._id,
      email: user.email,
      name: user.name
    };
    next();
    
  } catch (error) {
    console.error('认证中间件错误:', error);
    
    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        message: '无效的访问令牌'
      });
    }
    
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        message: '访问令牌已过期'
      });
    }
    
    res.status(500).json({
      success: false,
      message: '认证过程中发生错误'
    });
  }
};

/**
 * 可选认证中间件（用于可选登录的端点）
 */
const optionalAuth = async (req, res, next) => {
  try {
    const authHeader = req.header('Authorization');
    
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      // 没有令牌，继续处理但不设置用户
      return next();
    }

    const token = authHeader.substring(7);
    
    try {
      const decoded = verifyToken(token);
      const user = await User.findById(decoded.userId);
      
      if (user && user.isActive) {
        req.user = user;
      }
    } catch (error) {
      // 令牌无效，但继续处理请求
      console.warn('可选认证中令牌验证失败:', error.message);
    }
    
    next();
    
  } catch (error) {
    console.error('可选认证中间件错误:', error);
    next(); // 继续处理请求
  }
};

/**
 * 管理员权限检查中间件
 */
const requireAdmin = async (req, res, next) => {
  try {
    if (!req.user) {
      return res.status(401).json({
        success: false,
        message: '需要认证'
      });
    }

    const user = await User.findById(req.user.userId);
    if (!user || !user.isAdmin) {
      return res.status(403).json({
        success: false,
        message: '需要管理员权限'
      });
    }

    next();
  } catch (error) {
    console.error('管理员权限检查错误:', error);
    
    return res.status(500).json({
      success: false,
      message: '权限检查失败'
    });
  }
};

/**
 * 验证用户权限中间件
 */
const requireVerified = (req, res, next) => {
  if (!req.user) {
    return res.status(401).json({
      success: false,
      message: '需要认证'
    });
  }

  if (!req.user.isVerified) {
    return res.status(403).json({
      success: false,
      message: '需要验证账户'
    });
  }

  next();
};

module.exports = {
  auth,
  optionalAuth,
  requireAdmin,
  requireVerified
}; 